# -*- coding: utf-8 -*-
"""
Created on Fri Oct 29 18:56:08 2021

@author: Decay
"""

import numpy as np
import matplotlib.pyplot as plt
def lagrange(x,y,x_add):
     n=len(x)
     l=np.zeros(n) #初始化数组
     #计算第i个基函数的值
     for i in range(n):
         #乘法必须先有一个值，l[i]至少被乘n次，故取1       
         l[i]=1
         #计算第i个基函数中第j个项（每一项：分子除以分母）
         for j in range(n):
             if i!=j:
                 #基函数需要连乘得到
                 l[i]=l[i]*(x_add-x[j])/(x[i]-x[j])
         else:
             pass
         #计算需要预测的x_add对应的y值
     y_predict=0
     for i in range(n):
         y_predict+=l[i]*y[i]#所有基函数求和
     return y_predict


x=[1,2,3,4,5,6,7,8,9]
y=[1,1.41421,1.73205,2,2.23607,2.44949,2.64575,2.82843,3]
x_add=3.45
print(lagrange(x,y,x_add))

x_add=np.linspace(1,9,10)
y_list=[]
for i in range(len(x_add)):
    y_list.append(lagrange(x, y, x_add[i]))
plt.scatter(x,y,label="origin")
plt.scatter(x_add,y_list,label="lagrange")
plt.legend()
plt.show
